<?php 
/**
*file ImageTool.class.php
*水印 缩略图 验证码类
*
*水印：就是把指定的水印复制到目标上 并加透明效果
*imagecopymerge — 拷贝并合并图像的一部分 最后的参数是透明读
*缩略图：就是把大图复制到小尺寸画面上 
*imagecopyresampled — 重采样拷贝部分图像并调整大小
*/
defined('ACC') ||exit ('ACC Denied');

class ImageTool{
/**
*获取图片参数信息
*@param $image  传来需要处理的图片
*@param $info getimagesize 返回图片详细信息数组
*return array $img
*/  
public static function imageInfo($image){
      //判断图片是否存在
      if (!file_exists($image) ) {         
       	return false;
       } 
      //imageInfo 分析图片信息   
      $info = getimagesize($image);
        if ($info==false) {
         	return false;
         } 
         //$info数组
         $img['width'] = $info[0];
         $img['height'] = $info[1];
         $img['ext'] = substr($info['mime'],strpos($info['mime'], '/')+1);   
      return $img;
}

/**
*加水印
*@param string $dst   待操作图片
*@param string $water 水印小图
*@param string $save  加水印的图保存的路径  不填则替换原始图
*@param string $pos   水印位置
*@param string $alpha 透明度
*/
public static function water($dst,$water,$save=NULL,$pos=2,$alpha=50){
  if (!file_exists($dst) || !file_exists($water)) {
    return false;
   } 
   //首先水印小于原图
  $dinfo = self::imageInfo($dst);   //读原始图信息
  $winfo = self::imageInfo($water); //读水印信息
  if ($winfo['height'] > $dinfo['height'] || $winfo['width'] > $dinfo['width']) {
    return false;
  }  
   //动态加载函数 读两张图的后缀
  $dfunc = 'imagecreatefrom'.$dinfo['ext'];
  $wfunc = 'imagecreatefrom'.$winfo['ext'];
 if (!function_exists($dfunc) || !function_exists($wfunc)) {
     return false;
 }
  //动态加载函数 创建画布
 $dim = $dfunc($dst);  //创建待操作画布
 $wim = $wfunc($water); //创建水印
 
 //根据水印位置 计算粘贴的坐标
 switch ($pos) {
  case 0:          //左上角
    $posx = 0;
    $posy = 0;
    break;
  case 1:          //右上角
    $posx = $dinfo['width'] - $winfo['width'];
    $posy = 0;
    break;
  case 3:          //左下角
    $posx = 0;
    $posy = $dinfo['height'] - $winfo['height'];
    break;    
  default:         //右下角
    $posx = $dinfo['width'] - $winfo['width'];;
    $posy = $dinfo['height'] - $winfo['height'];
 }
 //加水印
 imagecopymerge($dim, $wim, $posx, $posy, 0, 0, $winfo['width'],$winfo['height'], $alpha);
 //保存水印路径
 if (!$save) {       //判断是否指定路径
   $save = $dst;
   unlink($dst);     //删除原图
 }
  //创建水印图
  $createfunc = 'image'. $dinfo['ext'];
  $createfunc($dim,$save);
  //销毁
  imagedestroy($dim);
  imagedestroy($wim);

  return true;

}

/**
*生成缩略图 thumb  
*缩略图：就是把大图复制到小尺寸画面上 imagecopyresampled
*
*/     
public static function thumb($dst,$save,$width=200,$height=200){
  //判断待处理图片是否存在
  $dinfo = self::imageInfo($dst);
  if ($dinfo == false) {
    return false;
  }
  //计算缩放比例  选小的
  $calc = min($width/$dinfo['width'],$height/$dinfo['height']);
  
  //创建原始画布
  $dfunc = 'imagecreatefrom' . $dinfo['ext'];
   $dim = $dfunc($dst);

   //创建缩略画布
   $tim = imagecreatetruecolor($width, $height);
   
   //创建白色颜料 填充缩略图用
   $white = imagecolorallocate($tim, 255, 255, 255);

   //填充白色到缩略图
   imagefill($tim, 0, 0, $white);

   //复制并缩略
     $dwidth = (int)$dinfo['width']*$calc;
     $dheight = (int)$dinfo['height']*$calc;

     $paddingx = (int)($width - $dwidth)/2;
     $paddingy = (int)($height - $dheight)/2;

   imagecopyresampled($tim, $dim, $paddingx, $paddingy, 0, 0,$dwidth, $dheight,
   $dinfo['width'], $dinfo['height']);
       
  //保存图片
   if (!$save) {
     $save = $dst;
     unlink($dst);
   }
   $createfunc = 'image' . $dinfo['ext'];
   $createfunc($tim,$save);

   imagedestroy($dim);
   imagedestroy($tim);
   return true; 
}

/**
*英文及数字验证码
*/
public static function capCode($width=50,$height=30){    
  //画布
  $img = imagecreatetruecolor($width, $height);
  //创建颜料
  $gray = imagecolorallocate($img, 0, 0, 0);
  //随机码颜色
  $randcolor = imagecolorallocate($img, mt_rand(0,156),mt_rand(0,156),mt_rand(200,255));
  //随机线颜色
  $line = imagecolorallocate($img,mt_rand(0,150),mt_rand(0,150),mt_rand(0,150));
  $line1 = imagecolorallocate($img,mt_rand(0,150),mt_rand(0,150),mt_rand(0,150));
  $line2 = imagecolorallocate($img,mt_rand(0,150),mt_rand(0,150),mt_rand(0,150));
  //填充背景
  imagefill($img, 0, 0, $gray);
  //干扰线
  imageline($img,0,mt_rand(0,25),50,mt_rand(0,25),$line);
  imageline($img,0,mt_rand(0,25),50,mt_rand(0,25),$line1);
  imageline($img,0,mt_rand(0,25),50,mt_rand(0,25),$line2);
  //随机码
  $str = substr(str_shuffle('QWETYUIPASDFGHJKZXCVBNMqwetyuipasdfghjkzxcvbnm23456789'), 0,4);
  imagestring($img, 5, 5, 5, $str, $randcolor);

  imagepng($img);
  imagedestroy($img);
  
}

/**
*做中文验证码
*imagettftext — 用 TrueType 字体向图像写入文本
*
*如何产生随机的中文字符串 中文安其uniccode编码 是有规律的 位于 0x4e00-0x9fa0
*但是请注意 对于客户来说 能否认识  随机选取常用汉字 放数组里 
*/
public static function chianCode($width=66,$height=44){
  //选常用字体 放数组中 
  $char = array('中','华','人','民','共','和','国','我','是','湖','南','郴','州');
  //打乱
  shuffle($char);
  //随机选取字体
  $code = implode('',array_slice($char, 0,4));
  //画布
  $im = imagecreatetruecolor($width, $height);
  //创建颜料
  $gray = imagecolorallocate($im, 0,0,0);//背景色
  $fontcolor = imagecolorallocate($im, mt_rand(200,255),mt_rand(0,150),mt_rand(0,150));
  //随机颜色
  $randcolor = imagecolorallocate($im, mt_rand(0,156), mt_rand(0,156),mt_rand(0,156));
  $randcolor1 = imagecolorallocate($im, mt_rand(0,156), mt_rand(0,156),mt_rand(0,156));
  $randcolor2 = imagecolorallocate($im, mt_rand(0,156), mt_rand(0,156),mt_rand(0,156));
  //随机线
  imageline($im, 0, mt_rand(0,10), 68, mt_rand(0,30), $randcolor);
  imageline($im, 0, mt_rand(0,30), 68, mt_rand(0,30), $randcolor1);
  imageline($im, 0, mt_rand(0,30), 68, mt_rand(0,10), $randcolor2);
  //填充背景
  imagefill($im, 0, 0, $gray);
  //写字字体设置
  imagettftext($im, 12, 0, 2, 25, $fontcolor, './ch/msyh.ttf', $code);
  //显示图像
  imagejpeg($im);
  //销毁资源
  imagedestroy($im);
  return $code;

}


}

//print_r(ImageTool::imageinfo('./off.jpg'));
/*
测水印
echo ImageTool::water('./off.jpg','./off1.jpg','ooo.jpg',0)?'ok':'no';
echo ImageTool::water('./off.jpg','./off1.jpg','ooo1.jpg',1)?'ok':'no';
echo ImageTool::water('./off.jpg','./off1.jpg','ooo2.jpg',2)?'ok':'no';
echo ImageTool::water('./off.jpg','./off1.jpg','ooo3.jpg',3)?'ok':'no';
*/

//echo ImageTool::thumb('./off.jpg','zzz.jpg',200,200)?'ok':'no';
//echo ImageTool::thumb('./off.jpg','zzz1.jpg',300,200)?'ok':'no';
//echo ImageTool::thumb('./063.jpg','zzz2.jpg',200,300)?'ok':'no';


?>